/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.todoterreno.dao.impl;

import com.todoterreno.dao.GestionImagenesInter;
import com.todoterreno.model.CasaTerreno;
import com.todoterreno.model.CasaTerrenoDet;
import com.todoterreno.model.CasaTerrenoVertical;
import com.todoterreno.model.Venta;
import com.todoterreno.utils.EstadoConexion;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.util.*;

/**
 *
 * @author davex
 */
public class GestionImagenesInterDao implements GestionImagenesInter{
    
    

    public List<String> consultarImagenesArchivo() {
        List<String> listarch=new LinkedList<String>();
        try{
            
            File archivo = new File("/home/davidpanel/archivos/imagenes.txt");
            if(archivo.exists()){
                System.out.println("Entro a leer el archivo");
                FileReader fileR = new FileReader(archivo);
                BufferedReader bufferR = new BufferedReader(fileR);

                while(bufferR.ready()){
                    listarch.add(bufferR.readLine());
                }

                fileR.close();
                bufferR.close();
            }else{
                System.out.println("El archivo no existe");
                
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return listarch;
    }

    public List<CasaTerreno> consultarCasas(int tipoSel, String depto) {
        
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        List<CasaTerreno> listcasa=new ArrayList<CasaTerreno>();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT a.idcasater, a.nombrefoto, a.precio, a.descripcion, a.cuartos, a.banios, a.tamanio, a.tipo,"
                        +"a.fecha, a.idestado, a.direccion, a.nombreplano FROM terreno.casaterreno a where upper(a.direccion) like '%"+depto+"%' and a.tipo=? order by a.fecha desc";
                
             pst=conn.prepareStatement(sql);
             pst.setInt(1, tipoSel);
             rs=pst.executeQuery();
             while(rs.next()){
                 CasaTerreno ct=new CasaTerreno();
                 ct.setIdcasater(rs.getString("idcasater"));
                 ct.setNombrefoto(rs.getString("nombrefoto"));
                 ct.setPrecio(rs.getString("precio"));
                 ct.setDescripcion(rs.getString("descripcion"));
                 ct.setCuartos(rs.getString("cuartos"));
                 ct.setBanios(rs.getString("banios"));
                 ct.setTamanio(rs.getString("tamanio"));
                 ct.setTipo(rs.getString("tipo"));
                 ct.setFecha(rs.getString("fecha"));
                 ct.setIdestado(rs.getString("idestado"));
                 ct.setDireccion(rs.getString("direccion"));
                 ct.setNombreplano(rs.getString("nombreplano"));
                 listcasa.add(ct);
             }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return listcasa;
    }
    
    public List<CasaTerreno> consultarTodasCasas() {
        
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        List<CasaTerreno> listcasa=new ArrayList<CasaTerreno>();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT a.idcasater, a.nombrefoto, a.precio, a.descripcion, a.cuartos, a.banios, a.tamanio, a.tipo,"
                        +"a.fecha, a.idestado, a.direccion, a.nombreplano FROM terreno.casaterreno a order by a.fecha desc";
                
             pst=conn.prepareStatement(sql);
             rs=pst.executeQuery();
             while(rs.next()){
                 CasaTerreno ct=new CasaTerreno();
                 ct.setIdcasater(rs.getString("idcasater"));
                 ct.setNombrefoto(rs.getString("nombrefoto"));
                 ct.setPrecio(rs.getString("precio"));
                 ct.setDescripcion(rs.getString("descripcion"));
                 ct.setCuartos(rs.getString("cuartos"));
                 ct.setBanios(rs.getString("banios"));
                 ct.setTamanio(rs.getString("tamanio"));
                 ct.setTipo(rs.getString("tipo"));
                 ct.setFecha(rs.getString("fecha"));
                 ct.setIdestado(rs.getString("idestado"));
                 ct.setDireccion(rs.getString("direccion"));
                 ct.setNombreplano(rs.getString("nombreplano"));
                 listcasa.add(ct);
             }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return listcasa;
    }

    public List<String> consultarImagenesPortada() {
        List<String> listaportada=new LinkedList<String>();
        
        try{
            File carpeta=new File("/home/davidpanel/portada/");
            String[] imagenes = carpeta.list();
            System.out.println("Size img carpeta: "+imagenes.length);
            if(imagenes.length>0){
                listaportada.addAll(Arrays.asList(imagenes));
            }
            
            
        }catch(Exception e){
            e.printStackTrace();
        }
        return listaportada;
    }

    public List<CasaTerrenoVertical> consultarListing(int tipoSel) {
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        List<CasaTerrenoVertical> listcasa=new ArrayList<CasaTerrenoVertical>();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT  a.idcasater, a.nombrefoto, a.precio, a.descripcion, a.cuartos, a.banios, a.tamanio, a.tipo,"
                        +"a.fecha, a.idestado, a.direccion FROM terreno.casaterreno a where a.tipo=? order by idcasater";
            
             
             pst=conn.prepareStatement(sql);
             pst.setInt(1, tipoSel);
             rs=pst.executeQuery();
             List<CasaTerreno> listact=new LinkedList<CasaTerreno>();
             while(rs.next()){
                 CasaTerreno ct=new CasaTerreno();
                 ct.setIdcasater(rs.getString("idcasater"));
                 ct.setNombrefoto(rs.getString("nombrefoto"));
                 ct.setPrecio(rs.getString("precio"));
                 ct.setDescripcion(rs.getString("descripcion"));
                 ct.setCuartos(rs.getString("cuartos"));
                 ct.setBanios(rs.getString("banios"));
                 ct.setTamanio(rs.getString("tamanio"));
                 ct.setTipo(rs.getString("tipo"));
                 ct.setFecha(rs.getString("fecha"));
                 ct.setIdestado(rs.getString("idestado"));
                 ct.setDireccion(rs.getString("direccion"));
                 
                 listact.add(ct);
             }
             
             for(int i=0;i<listact.size();i+=2){
                 CasaTerrenoVertical ctv=new CasaTerrenoVertical();
                 ctv.setIdctv(((i==0)?1:(i-1))+"");
                 ctv.setCasa1(listact.get(i));
//                 if(listact.size()==(i+1)){
//                     ctv.setCasa2(new CasaTerreno());
//                 }else{
                     ctv.setCasa2(listact.get(i+1));
//                 }
                 
                 listcasa.add(ctv);
             }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return listcasa;
    }

    public CasaTerrenoDet consultarDetalleCasa(String codcasa) {
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        CasaTerrenoDet ctd=new CasaTerrenoDet();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT iddet, idcasater, fotodet, descdet"
                +" FROM terreno.detcasaterreno where idcasater=?";

             pst=conn.prepareStatement(sql);
             pst.setString(1, codcasa);
             rs=pst.executeQuery();
             List<String> listadet=new LinkedList<String>();
             
             while(rs.next()){
                 if(!"".equals(rs.getString("descdet"))){
                     ctd.setIdDet(rs.getString("iddet"));
                     ctd.setCodcasa(rs.getString("idcasater"));
                     ctd.setDescDet(rs.getString("descdet"));
                     listadet.add(rs.getString("fotodet"));
                 }else{
                     listadet.add(rs.getString("fotodet"));
                 }
             }
             
             ctd.setFotosDet(listadet);

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return ctd;
    }

    public CasaTerreno consultarCasaPorFoto(String nombrecasa) {
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        CasaTerreno ctp=new CasaTerreno();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT a.idcasater, a.nombrefoto, a.precio, a.descripcion, a.cuartos, a.banios, a.tamanio, a.tipo,"
                +"a.fecha, a.idestado, a.direccion FROM terreno.casaterreno a where a.nombrefoto=?";
               
             
             pst=conn.prepareStatement(sql);
             pst.setString(1, nombrecasa);
//             System.out.println("SQL: "+sql+","+nombrecasa);
             rs=pst.executeQuery();
             while(rs.next()){
                 ctp.setIdcasater(rs.getString("idcasater"));
                 ctp.setNombrefoto(rs.getString("nombrefoto"));
                 ctp.setPrecio(rs.getString("precio"));
                 ctp.setDescripcion(rs.getString("descripcion"));
                 ctp.setCuartos(rs.getString("cuartos"));
                 ctp.setBanios(rs.getString("banios"));
                 ctp.setTamanio(rs.getString("tamanio"));
                 ctp.setTipo(rs.getString("tipo"));
                 ctp.setFecha(rs.getString("fecha"));
                 ctp.setIdestado(rs.getString("idestado"));
                 ctp.setDireccion(rs.getString("direccion"));
             }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return ctp;
    }

    public List<CasaTerreno> buscarCasas(String idcasa, String depto, int tipo, int dormi, int banios, double minPrec, double maxPrec) {
        
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        List<CasaTerreno> listcasa=new ArrayList<CasaTerreno>();
        String where="";
        String and="";
        try{
            
            if(!"".equals(idcasa)){
                where="a.idcasater='"+idcasa+"'";
            }
            if(!"".equals(depto)){
                and=!"".equals(where)?" and ":"";
                where=where+and+"upper(a.direccion) like '%"+depto+"%'";
            }
            if(tipo>0){
                and=!"".equals(where)?" and ":"";
                where=where+and+"a.tipo="+tipo;
            }
            if(dormi>1){
                and=!"".equals(where)?" and ":"";
                where=where+and+"a.cuartos<="+dormi;
            }
            if(banios>0){
                and=!"".equals(where)?" and ":"";
                where=where+and+"a.banios<="+banios;
            }
            if(minPrec>0 && maxPrec>0){
                and=!"".equals(where)?" and ":"";
                where=where+and+"a.precio between "+minPrec+" and "+maxPrec;
            }
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT a.idcasater, a.nombrefoto, a.precio, a.descripcion, a.cuartos, a.banios, a.tamanio, a.tipo,"
                        +"a.fecha, a.idestado, a.direccion FROM terreno.casaterreno a where "+where+" order by idcasater";
                
            System.out.println("SQL 3: "+sql);
             
            pst=conn.prepareStatement(sql);
             rs=pst.executeQuery();
             while(rs.next()){
                 CasaTerreno ct=new CasaTerreno();
                 ct.setIdcasater(rs.getString("idcasater"));
                 ct.setNombrefoto(rs.getString("nombrefoto"));
                 ct.setPrecio(rs.getString("precio"));
                 ct.setDescripcion(rs.getString("descripcion"));
                 ct.setCuartos(rs.getString("cuartos"));
                 ct.setBanios(rs.getString("banios"));
                 ct.setTamanio(rs.getString("tamanio"));
                 ct.setTipo(rs.getString("tipo"));
                 ct.setFecha(rs.getString("fecha"));
                 ct.setIdestado(rs.getString("idestado"));
                 ct.setDireccion(rs.getString("direccion"));
                 listcasa.add(ct);
             }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return listcasa;
    }

    public List<CasaTerrenoVertical> consultarPorDepto(String depto) {
        
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        List<CasaTerrenoVertical> listcasa=new ArrayList<CasaTerrenoVertical>();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT a.idcasater, a.nombrefoto, a.precio, a.descripcion, a.cuartos, a.banios, a.tamanio, a.tipo,"
                        +"a.fecha, a.idestado, a.direccion FROM terreno.casaterreno a where upper(a.direccion) like '%"+depto+"%' order by a.fecha desc";
            
             
             pst=conn.prepareStatement(sql);

             rs=pst.executeQuery();
             List<CasaTerreno> listact=new LinkedList<CasaTerreno>();
             while(rs.next()){
                 CasaTerreno ct=new CasaTerreno();
                 ct.setIdcasater(rs.getString("idcasater"));
                 ct.setNombrefoto(rs.getString("nombrefoto"));
                 ct.setPrecio(rs.getString("precio"));
                 ct.setDescripcion(rs.getString("descripcion"));
                 ct.setCuartos(rs.getString("cuartos"));
                 ct.setBanios(rs.getString("banios"));
                 ct.setTamanio(rs.getString("tamanio"));
                 ct.setTipo(rs.getString("tipo"));
                 ct.setFecha(rs.getString("fecha"));
                 ct.setIdestado(rs.getString("idestado"));
                 ct.setDireccion(rs.getString("direccion"));
                 
                 listact.add(ct);
             }
             
             for(int i=0;i<listact.size();i+=2){
                 CasaTerrenoVertical ctv=new CasaTerrenoVertical();
                 ctv.setIdctv(((i==0)?1:(i-1))+"");
                 ctv.setCasa1(listact.get(i));
                 if(listact.size()==(i+1)){
                     ctv.setCasa2(new CasaTerreno());
                 }else{
                     ctv.setCasa2(listact.get(i+1));
                 }
                 
                 listcasa.add(ctv);
             }
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return listcasa;
    
    }
    
    public boolean insertaVenta(Venta venta) {
        Connection conn=null;
        PreparedStatement pst=null;
        boolean isInsert=false;
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="INSERT INTO terreno.venta(idventa, direccion, tamanio, esconstruido, esduenio, nombre, correo, telefono, celular)" 
                +"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";
//            String sql="INSERT INTO terreno.venta(direccion, tamanio, esconstruido, esduenio, nombre, correo, telefono, celular)" 
//                +"VALUES(?, ?, ?, ?, ?, ?, ?, ?)";

             pst=conn.prepareStatement(sql);
             pst.setInt(1, Integer.parseInt(venta.getIdVenta()));
             pst.setString(1, venta.getDireccionVent());
             pst.setString(2, venta.getTamanio());
             pst.setString(3, venta.getEsConstruido());
             pst.setString(4, venta.getEsDuenio());
             pst.setString(5, venta.getNombre());
             pst.setString(6, venta.getCorreo());
             pst.setString(7, venta.getTelefono());
             pst.setString(8, venta.getCelular());
             
             if(pst.executeUpdate()>0){
                 isInsert=true;
             }
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{

                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return isInsert;
    }

    public List<Venta> consultarCasasVenta() {
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        List<Venta> listaventa=new LinkedList<Venta>();
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="SELECT idventa, direccion, tamanio, esconstruido, esduenio,"
                +"nombre, correo, telefono, celular FROM terreno.venta";

             pst=conn.prepareStatement(sql);
             rs=pst.executeQuery();
             int count=1;
             while(rs.next()){
                 Venta v=new Venta();
                 v.setIdVenta(count+"");
                 v.setDireccionVent(rs.getString("direccion"));
                 v.setTamanio(rs.getString("tamanio"));
                 v.setEsConstruido(rs.getString("esconstruido"));
                 v.setEsDuenio(rs.getString("esduenio"));
                 v.setNombre(rs.getString("nombre"));
                 v.setCorreo(rs.getString("correo"));
                 v.setTelefono(rs.getString("telefono"));
                 v.setCelular(rs.getString("celular"));
                 listaventa.add(v);
             } 
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return listaventa;
    }

    public boolean insertarCasaTerreno(CasaTerreno casa, CasaTerrenoDet casaDet) {
        Connection conn=null;
        PreparedStatement pst=null;
        boolean isInsert=false;
        DecimalFormat df=new DecimalFormat("#.00");
        try{
            
            conn=EstadoConexion.createConnect();
            
            String sql="INSERT INTO terreno.casaterreno(idcasater, nombrefoto, precio, descripcion,"
                    + " cuartos, banios, tamanio, tipo, fecha, idestado, direccion, nombreplano)" 
                    +" VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
//            String sql="INSERT INTO terreno.casaterreno( nombrefoto, precio, descripcion,"
//                    + " cuartos, banios, tamanio, tipo, fecha, idestado, direccion, nombreplano)" 
//                    +" VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

             pst=conn.prepareStatement(sql);
             
             pst.setString(1, casa.getIdcasater());
             pst.setString(1, casa.getNombrefoto());
             pst.setDouble(2, Double.valueOf(casa.getPrecio()));
             pst.setString(3, casa.getDescripcion());
             pst.setInt(4, Integer.parseInt(casa.getCuartos()));
             pst.setInt(5, Integer.parseInt(casa.getBanios()));
             pst.setDouble(6, Double.valueOf(casa.getTamanio()));
             pst.setInt(7, Integer.parseInt(casa.getTipo()));
             Calendar cal=Calendar.getInstance();
             pst.setDate(8, new Date(cal.getTimeInMillis()));
             pst.setInt(9, Integer.parseInt(casa.getIdestado()));
             pst.setString(10, casa.getDireccion());
             pst.setString(11, casa.getNombreplano());
             
             pst.executeUpdate();
             insertarCasaDetalle(casaDet);
             isInsert=true;
             
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{

                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return isInsert;
    }

    public boolean insertarCasaDetalle(CasaTerrenoDet casaDet) {
        Connection conn=null;
        PreparedStatement pst=null;
        boolean isInsert=false;
        try{
            
            conn=EstadoConexion.createConnect();
            String sql="INSERT INTO terreno.detcasaterreno(iddet, idcasater,"
                    + " fotodet, descdet) VALUES(?, ?, ?, ?)";
//            String sql="INSERT INTO terreno.detcasaterreno(idcasater,"
//                    + " fotodet, descdet) VALUES( ?, ?, ?)";

            int x=0;
             pst=conn.prepareStatement(sql);
             for(String im:casaDet.getFotosDet()){
                 pst.setInt(1, consultaseq("select nextval('terreno.seqdet')"));
                 pst.setInt(2, Integer.parseInt(casaDet.getCodcasa()));
                 pst.setString(3, im);
                 if(x==0){
                     pst.setString(4, casaDet.getDescDet());                     
                 }else{
                     pst.setString(4, "");
                 }
                 x++;
                 
             }
             
             
             isInsert=true;
             
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{

                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return isInsert;
    }

    public boolean insertaImagen(String nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public int consultaseq(String sql) {
        Connection conn=null;
        PreparedStatement pst=null;
        ResultSet rs=null;
        int seq=0;
        try{
            
            conn=EstadoConexion.createConnect();

             pst=conn.prepareStatement(sql);
             rs=pst.executeQuery();
             
             while(rs.next()){
                 seq=rs.getInt("nextval");
             }
             
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                EstadoConexion.closeResult(rs);
                EstadoConexion.closePrepared(pst);
                EstadoConexion.closeConect(conn);
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return seq;
    }

    

    
}
